/*
 * LDIR
 * 
 * LDIR, a GPS cartography application built for Let's Do It Romania eco 
 * campaign.
 * Copyright (C) 2010 Genera Software <office@generasoftware.com>
 * 
 * http://generasoftware.com/
 * 
 * This program is free software; you can redistribute it and/or modify it under
 * the terms of the GNU General Public License as published by the Free Software
 * Foundation; either version 2 of the License, or (at your option) any later
 * version.
 * 
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
 * details.
 * 
 * You should have received a copy of the GNU General Public License along with
 * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
 * Place, Suite 330, Boston, MA 02111-1307 USA
 */
#include "bitmapmethods.h"
#include <eikenv.h>
#include <fbs.h>


CFbsBitGc* NBitmapMethods::CreateGraphicsContextLC(CFbsBitmapDevice& aBitmapDevice)
	{
	CFbsBitGc* graphicsContext = NULL;
	User::LeaveIfError(aBitmapDevice.CreateContext(graphicsContext));
	CleanupStack::PushL(graphicsContext);
	return graphicsContext;
	}


CFbsBitGc* NBitmapMethods::CreateGraphicsContextL(CFbsBitmapDevice& aBitmapDevice)
	{
	CFbsBitGc* gc = CreateGraphicsContextLC(aBitmapDevice);
	CleanupStack::Pop(gc);
	return gc;
	}


CFbsBitmapDevice* NBitmapMethods::CreateBitmapDeviceLC(CFbsBitmap& aBitmap)
	{
	CFbsBitmapDevice* bitmapDevice = CFbsBitmapDevice::NewL(&aBitmap);
	CleanupStack::PushL(bitmapDevice);
	return bitmapDevice;
	}


CFbsBitmapDevice* NBitmapMethods::CreateBitmapDeviceL(CFbsBitmap& aBitmap)
	{
	CFbsBitmapDevice* device = CreateBitmapDeviceLC(aBitmap);
	CleanupStack::Pop(device);
	return device;
	}


CFbsBitmap* NBitmapMethods::CreateBitmapLC(TSize aSizeInPixels,TDisplayMode aDispMode)
	{
	CFbsBitmap* bitmap = new(ELeave) CFbsBitmap();
	CleanupStack::PushL(bitmap);
	User::LeaveIfError(bitmap->Create(aSizeInPixels,aDispMode));
	//ASSERT((bitmap->DisplayMode() == KColourDepth) || (bitmap->DisplayMode()  == EGray2));
	return bitmap;
	}


CFbsBitmap* NBitmapMethods::CreateBitmapL(TSize aSizeInPixels,TDisplayMode aDispMode)
	{
	CFbsBitmap* bitmap = CreateBitmapLC(aSizeInPixels,aDispMode);
	CleanupStack::Pop(bitmap);
	return bitmap;
	}


CFbsBitmap* NBitmapMethods::CreateBitmapLC(const TDesC& aFileName,TInt aId)
	{
	CFbsBitmap* bitmap = new(ELeave) CFbsBitmap();

	CleanupStack::PushL(bitmap);
	TInt loadException = bitmap->Load(aFileName,aId);
	User::LeaveIfError(loadException);

    return bitmap;

// 	if ((bitmap->DisplayMode() == KColourDepth) || (bitmap->DisplayMode()  == EGray2))
// 		{
// 		return bitmap;
// 		}
// 	else
// 		{
// 		CFbsBitmap* newBitmap = CreateBitmapLC(	bitmap->SizeInPixels(),KColourDepth);															
// 
// 		CFbsBitmapDevice*		bitmapDevice	= CreateBitmapDeviceLC(*newBitmap);
// 		CFbsBitGc*				bitmapGc		= CreateGraphicsContextLC(*bitmapDevice);
// 		bitmapGc->BitBlt(TPoint(0,0),bitmap,TRect(bitmap->SizeInPixels()));
// 		CleanupStack::PopAndDestroy(2); // gc and device
// 		// The next three lines are here to get rid of the old bitmap but keep the new one 
// 		CleanupStack::Pop(newBitmap);
// 		CleanupStack::PopAndDestroy(bitmap);
// 		CleanupStack::PushL(newBitmap);
// 
// 		return newBitmap;
// 		}
	}


CFbsBitmap* NBitmapMethods::CreateBitmapL(const TDesC& aFileName,TInt aId)
	{
	CFbsBitmap* bitmap = CreateBitmapLC(aFileName, aId);
	CleanupStack::Pop(bitmap);
	return bitmap;
	}

void NBitmapMethods::BitBltMaskedEntireBitmap(CFbsBitGc& aTargetGc,TPoint aTopLeft,
											  const CFbsBitmap& aBitmap,const CFbsBitmap& aBitMask)
	{
	PartialReset(aTargetGc);
	aTargetGc.BitBltMasked(aTopLeft,&aBitmap,aBitmap.SizeInPixels(),&aBitMask,ETrue);
	PartialReset(aTargetGc);
	}


void NBitmapMethods::PartialReset(CFbsBitGc& aGc)
	{
	aGc.SetPenSize(TSize(1,1));
	aGc.SetPenColor(KRgbBlack);
	aGc.SetPenStyle(CFbsBitGc::ESolidPen);
	aGc.SetDrawMode(CFbsBitGc::EDrawModePEN);
	aGc.DiscardFont();
	aGc.DiscardBrushPattern();
	aGc.SetBrushColor(KRgbWhite);
	aGc.SetBrushStyle(CFbsBitGc::ENullBrush);
	aGc.SetCharJustification(0,0);
	aGc.SetWordJustification(0,0);
	aGc.SetDitherOrigin(TPoint(0,0));
	aGc.SetPenStyle(CFbsBitGc::ENullPen);
	aGc.SetShadowMode(EFalse);
	aGc.SetStrikethroughStyle(EStrikethroughOff);
	aGc.SetUnderlineStyle(EUnderlineOff);
	aGc.SetUserDisplayMode(ENone);
	}
